import router from '@/router'
import { SystemRouter, CmsRouter } from '@/router'
import store from '@/store'
import NProgress from 'nprogress'
import 'nprogress/nprogress.css'
import { getToken } from "@/utils/cookie";
import { getSessionStorage } from "../utils/storage";

const whiteList = ['/login', '/401', '/404', '/500'] //不重定向的白名单

/**
 * 页面级验证权限，验证是否有权限访问该组件
 * @param permissions 个人权限集（页面组件）
 * @param auth 待验证的权限
 */
function hasPermission(permissions, auth) {
    //待验证权限不为空时才需要判断是否有权限
    if(auth) {
        return permissions.some((currentValue,index,arr) => currentValue === auth)
    } else {
        //auth为undefined是不需要验证权限
        return true
    }
}

router.beforeEach((to, from, next) => {
    NProgress.start() //开启NProgress进度条

    if(getToken()) {    //判断是否有token
        if(to.path === '/login') {  //如果token存在并且当前页面是login则直接重定向到主页
           next({path: '/'})
        } else {

            if(store.getters.user.account == null) {
                //拉取用户信息
                store.dispatch('GetUser', getToken()).then((res) => {
                    if(!res.status) {
                        next('/login')
                        return
                    }

                    let asyncRouter = []
                    let ROUTER_TYPE = getSessionStorage('RouterType');
                    if(ROUTER_TYPE === 'CMS') {
                        asyncRouter = CmsRouter
                    } else {
                        asyncRouter = SystemRouter
                    }
                    // 生成可访问的路由表
                    store.dispatch('GeneratorRouters', asyncRouter).then(() => {
                        router.addRoutes(store.getters.addRouters) // 动态添加可访问路由表
                        next(...to)
                    })

                    next(...to) // hack方法 确保addRoutes已完成

                }).catch((error) => {
                    console.log('获取当前登录用户信息异常')
                    //如果拉取用户信息失败，则重定向到登录页面
                    store.dispatch('FedLogOut').then(() => {
                        next({ path: '/login' })
                    })
                })
            } else {
                if(whiteList.indexOf(to.path) !== -1) { //在免登录白名单中，直接进入
                    next()
                } else { //验证权限
                    if(hasPermission(store.getters.user.permissions, to.meta.auth)) {
                        next()
                    } else {
                        next({ path: '/401' })
                    }
                }
            }
        }
    } else {
        if(whiteList.indexOf(to.path) !== -1) { //在免登录白名单中，直接进入
            next()
        } else {
            next('/login')      //否则全部重定向到登录页
            NProgress.done()    //结束NProgress进度条
        }
    }
})

router.afterEach(() => {
    NProgress.done() //结束NProgress进度条
})
